/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fr.sorbonne.inf5.yams.controleur;

import fr.sorbonne.inf5.yams.exceptions.AccessDataException;
import fr.sorbonne.inf5.yams.model.AbstractJoueur;
import fr.sorbonne.inf5.yams.model.IASequentiel;

import fr.sorbonne.inf5.yams.model.IAYams;
import fr.sorbonne.inf5.yams.model.Joueur;
import fr.sorbonne.inf5.yams.model.LignePalmares;
import fr.sorbonne.inf5.yams.model.Yams;
import fr.sorbonne.inf5.yams.properties.BundleTool;
import fr.sorbonne.inf5.yams.vue.DialogDeuxJoueurs;
import fr.sorbonne.inf5.yams.vue.DialogUnJoueur;
import fr.sorbonne.inf5.yams.vue.VueApplication;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

/**
 * Classe en charge du controle 
 * de l'application
 * @author Dubos Romain
 * @author Oukherfellah Riad
 */
public class ControleurApplication implements ActionListener, WindowListener {

    private VueApplication vue;
    private Yams model;
    private ControleurJeu jeu;

    /**
     * Constructeur
     * @param pVue vue de l'application
     * @param pModel modèle de l'application
     */
    public ControleurApplication(VueApplication pVue, Yams pModel) {
        this.vue = pVue;
        this.model = pModel;
        this.jeu = new ControleurJeu(pVue, pModel);
        vue.abonnementJeu(jeu);
        try {
            model.chargerPalmares();
        } catch (AccessDataException ex) {
            vue.afficherMessageErreur(VueApplication.T8, VueApplication.M8);
        }
    }

    public void actionPerformed(ActionEvent ae) {
        String event = ae.getActionCommand();

        //GESTION DE LA LANGUE
        if (event.equals(VueApplication.FRANCAIS)) {
            BundleTool.setBundle(Locale.FRANCE);
            vue.nommerComposants();
            vue.renvoyerVueCombinaisons().nommerComposants();
            vue.bloqueItemLangueCourante();
        }
        if (event.equals(VueApplication.ANGLAIS)) {
            BundleTool.setBundle(Locale.UK);
            vue.nommerComposants();
            vue.renvoyerVueCombinaisons().nommerComposants();
            vue.bloqueItemLangueCourante();
        }

        //QUITTER
        if (event.equals(VueApplication.QUITTER)) {
            System.exit(0);
        }

        //CLIQUE SUR NOUVELLE PARTIE 2 JOUEURS DANS LE MENU
        if (event.equals(VueApplication.PARTIE_DEUX_JOUEURS)) {
            vue.getFenetreNom2Joueurs().afficherFenetre();
        }
        //CLIQUE SUR OK DE LA FENETRE NOUVELLE PARTIE 2 JOUEURS
        if (event.equals(DialogDeuxJoueurs.OK)) {
            vue.masquerScoreIA();
            vue.renvoyerVueDes().initialiseDesA1();
            if (!vue.getFenetreNom2Joueurs().isChampRemplit()) {
                vue.afficherMessageErreur(VueApplication.T1, VueApplication.M1);
                vue.getFenetreNom2Joueurs().afficherFenetre();
            } else {

                String nom1 = vue.getFenetreNom2Joueurs().getNom1();
                String nom2 = vue.getFenetreNom2Joueurs().getNom2();

                if (vue.getFenetreNom2Joueurs().isChampsIdentique(nom1, nom2)) {
                    vue.afficherMessageErreur(VueApplication.T4, VueApplication.M4);
                    vue.getFenetreNom2Joueurs().afficherFenetre();

                } else {

                    /**ICI CREATION DES JOUEURS**/
                    List<AbstractJoueur> joueurs = new ArrayList<AbstractJoueur>();
                    joueurs.add(new Joueur(nom1));
                    joueurs.add(new Joueur(nom2));


                    model.ajouterJoueur(joueurs);
                    /***************************/
                    vue.getFenetreNom2Joueurs().cacherFenetre();
                    vue.deGriserVue();
                    vue.renvoyerVueCombinaisons().initStringLabel();
                    vue.renvoyerVueCombinaisons().changeJoueurCourant(model.retournerJoueurCourant().getNom());
                }
            }
        }
        //CLIQUE SUR ANNULER DE LA FENETRE NOUVELLE PARTIE 2 JOUEURS
        if (event.equals(DialogDeuxJoueurs.ANNULER)) {
            //On ferme la fenetre
            vue.getFenetreNom2Joueurs().cacherFenetre();
        }



        //CLIQUE SUR NOUVELLE PARTIE 1 JOUEUR DANS LE MENU
        if (event.equals(VueApplication.PARTIE_UN_JOUEUR)) {
            vue.getFenetreNom1JoueurSolo().afficherFenetre();
        }
        //CLIQUE SUR OK DE LA FENETRE NOUVELLE PARTIE 1 JOUEUR
        if (event.equals(DialogUnJoueur.OK)) {
            vue.masquerScoreIA();
            vue.renvoyerVueDes().initialiseDesA1();
            if (!vue.getFenetreNom1JoueurSolo().isChampRemplit()) {
                vue.afficherMessageErreur(VueApplication.T1, VueApplication.M1);
                vue.getFenetreNom1JoueurSolo().afficherFenetre();
            } else {

                /**ICI CREATION DU JOUEUR**/
                List<AbstractJoueur> joueurs = new ArrayList<AbstractJoueur>();
                joueurs.add(new Joueur(vue.getFenetreNom1JoueurSolo().getNom1()));
                model.ajouterJoueur(joueurs);
                /***************************/
                vue.getFenetreNom1JoueurSolo().cacherFenetre();
                vue.renvoyerVueCombinaisons().initStringLabel();
                vue.deGriserVue();
                vue.renvoyerVueCombinaisons().changeJoueurCourant(model.retournerJoueurCourant().getNom());
            }
        }
        //CLIQUE SUR ANNULER DE LA FENETRE NOUVELLE PARTIE 1 JOUEUR
        if (event.equals(DialogUnJoueur.ANNULER)) {
            //On ferme la fenetre
            vue.getFenetreNom1JoueurSolo().cacherFenetre();
        }


        //CLIQUE SUR NOUVELLE PARTIE CONTRE L'ORDI DANS LE MENU
        if (event.equals(VueApplication.PARTIE_CONTRE_ORDI)) {
            vue.getFenetreNom1JoueurOrdi().afficherFenetre();
        }
        //CLIQUE SUR OK DE LA FENETRE PARTIE CONTRE L'ORDI
        if (event.equals(DialogUnJoueur.OK_ORDI)) {
            vue.renvoyerVueDes().initialiseDesA1();
            if (!vue.getFenetreNom1JoueurOrdi().isChampRemplit()) {
                vue.afficherMessageErreur(VueApplication.T1, VueApplication.M1);
                vue.getFenetreNom1JoueurOrdi().afficherFenetre();
            } else {

                /**ICI CREATION DU JOUEUR**/
                List<AbstractJoueur> joueurs = new ArrayList<AbstractJoueur>();
                joueurs.add(new Joueur(vue.getFenetreNom1JoueurOrdi().getNom1()));
                joueurs.add(new IASequentiel("IA Sequentiel", new IAYams(model)));
                model.ajouterJoueur(joueurs);
                /***************************/
                vue.getFenetreNom1JoueurOrdi().cacherFenetre();
                vue.renvoyerVueCombinaisons().initStringLabel();
                vue.deGriserVue();
                vue.renvoyerVueCombinaisons().changeJoueurCourant(model.retournerJoueurCourant().getNom());
                vue.afficherScoreIA("0");
            }
        }
        //CLIQUE SUR ANNULER DE LA FENETRE PARTIE CONTRE L'ORDI
        if (event.equals(DialogUnJoueur.ANNULER_ORDI)) {
            //On ferme la fenetre
            vue.getFenetreNom1JoueurOrdi().cacherFenetre();
        }

        //AFFICHAGE DES SCORES
        if (event.equals(VueApplication.AFFICHER_SCORE)) {

            StringBuilder palm = new StringBuilder();
            for (LignePalmares lp : model.renvoyerPalmares()) {
                palm.append(lp.toString());
                palm.append("\n");
            }

            if (palm.length() == 0) {
                palm.append(BundleTool.getBundle().getString("noPalmares"));
            }

            vue.afficherMessageInfo(VueApplication.T5, palm.toString());
        }

    }

    public void windowOpened(WindowEvent e) {
    }

    public void windowClosing(WindowEvent e) {
        System.exit(0);
    }

    public void windowClosed(WindowEvent e) {
    }

    public void windowIconified(WindowEvent e) {
    }

    public void windowDeiconified(WindowEvent e) {
    }

    public void windowActivated(WindowEvent e) {
    }

    public void windowDeactivated(WindowEvent e) {
    }
}
